#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
#include <gtk/gtk.h>
#include <glib-2.0/glib.h>
#include <assert.h>

#include "ClefPrivee.h"
#include "ClefPublique.h"
#include "Contact.h"
#include "Agenda.h"
#include "Utilisateur.h"
#include "EnsUtilisateur.h"
#include "Crypter.h"
#include "Decrypter.h"
#include "InterfaceGraphique.h"
#include "Loguer.h"

gmp_randstate_t state;
char etat_identification=0;
/*
    etat_identification=0 --> l'utilisateur n'est pas connecté
    etat_identification=1 --> l'utilisateur est connecté
    etat_identification=2 --> on quitte le programme
*/


int main(int argc, char **argv)
{
    /*On initialise la graine pour les nombres aléatoires */
    gmp_randinit_mt(state);
    mpz_t temps;
    mpz_init_set_ui(temps, (unsigned long int)time(NULL));
    gmp_printf("voici le temps: %Zd \n", temps);
    gmp_randseed(state, temps);
    /*L'idée est que l'aléatoire n'existe pas en informatique,
    pour le simuler on utilise une suite définie par récurrence ( Un+1=f(Un) ) ici grâce à urandom,
    gmp_randinit_mt permet d'initialiser la variable state qui servira pour la récurrence,
    gmp_randseed permet de donner la premiere valeur de la suite (U0) */

    /* Initialisation de Gtk */
    gtk_init(&argc, &argv);

    /* Fenetre d'identification / nouvel utilisateur / supprimer un utilisateur */
    Utilisateur *u=NULL;

    /* On définit un booléen qui sera à 1 pour la durée du programme */
    char programme_en_cours=1;



    while (programme_en_cours==1)
    {
//        printf("voici la valeur de etat_identification dans main 1 : %d \n", etat_identification);
        if(etat_identification==0)
        {
            while(u==NULL && etat_identification!=2)
            {
                u=gestion_identifier();
//                printf("voici la valeur de etat_identification dans main 1.5 : %d \n", etat_identification);
                if(u!=NULL)
                {
                    etat_identification=1;
//                    printf("voici la valeur de etat_identification dans main 2 : %d \n", etat_identification);
                    programme_en_cours=1;
                }
            }
        }
        else if (etat_identification==1)
        {
//            printf("voici la valeur de etat_identification dans main 3 : %d \n", etat_identification);

            /* Fenêtre principale */
           gestion_lancer_MainWindow(u);
//            printf("voici la valeur de etat_identification dans main 4 : %d \n", etat_identification);
            u=NULL;
            programme_en_cours=1;
        }
        else if (etat_identification==2)
        {
//            printf("sortie de la boucle programme en cours \n");
            programme_en_cours=0;
        }
        else
        {
            exit(-1);
        }
    }

//    printf("sortie de la boucle programme en cours \n");

    /* TEST DE REGRESSSION*/
    //testRegressionContact();
    //testRegressionAgenda();
    //testRegressionUtilisateur();
    //testRegressionUtilisateur();
    //testRegressionEnsut();
    //testRegressionClefPublique();
    //testRegressionClefPrivee();
    //testRegressionCrypter();
    //testRegressionDecrypter();

    /* On libère l'utilisateur si il a été alloué */
    utilisateurLiberer(u);
    //agendaLiberer(&a);

    gmp_randclear(state);
    mpz_clear(temps);
    return 0;
}


